package ru.niir.goodfil.db;

import ru.niir.goodfil.db.dic.NotificationState;

import javax.persistence.*;
import java.io.Serializable;
import java.sql.Timestamp;

import static ru.niir.goodfil.utils.Utils.s;

/**
 * Уведомление.
 * Уведомление - это запись в таблице `Notifications`, говорящая о необходимости отправки сообщения по эл.почте.
 */
@Entity
@Table(name = "`Notifications`")
public class Notification implements Serializable {
    /**
     * Идентификатор
     */
    @Id
    @GeneratedValue
    @Column(name = "`Id`")
    private long id = -1;

    /**
     * Идентификатор пользователя (или службы), отправляющей сообщение
     */
    @Column(name = "`IdSender`")
    private long senderId = 0;

    /**
     * Статус уведомления
     *
     * @see ru.niir.goodfil.db.dic.NotificationState статусы уведомлений
     */
    @Column(name = "`IdNotificationState`")
    private int notificationState = NotificationState.NEW;

    /**
     * Адрес эл.почты получателя
     */
    @Column(name = "`Recipient`")
    private String recipient = "";

    /**
     * Текст сообщения
     */
    @Column(name = "`Text`", length = 3000)
    private String text = "";

    /**
     * Дата создания
     */
    @Column(name = "`CreationDate`")
    private Timestamp creationDate = GoodfilUtils.getCurrentTimestamp();

    @Column(name = "`Subject`")
    private String subject;

    /**
     * Отправитель сообщения
     */
    @Transient
    private User sender;

    public User getSender() {
        return sender;
    }

    public void setSender(User sender) {
        assert sender != null;
        assert sender.getId() == senderId;

        this.sender = sender;
    }

    /**
     * Конструктор
     */
    public Notification() {
    }

    /**
     * Конструктор
     *
     * @param senderId  идентификатор отправителя (пользователя)
     * @param recipient адрес эл.почты получателя
     * @param text      текст сообщения
     */
    public Notification(long senderId, String recipient, String text) {
        this.senderId = senderId;
        this.recipient = s(recipient);
        this.text = s(text);
    }

    /**
     * Конструктор
     *
     * @param senderId  идентификатор отправителя (пользователя)
     * @param recipient адрес эл.почты получателя
     * @param text      текст сообщения
     */
    public Notification(long senderId, String recipient, String subject, String text) {
        this.senderId = senderId;
        this.recipient = s(recipient);
        this.subject = s(subject);
        this.text = s(text);
    }

    //
    //  ------------------------------------------------------------------------------------
    //

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public long getSenderId() {
        return senderId;
    }

    public void setSenderId(long senderId) {
        this.senderId = senderId;
    }

    public int getNotificationState() {
        return notificationState;
    }

    public void setNotificationState(int notificationState) {
        this.notificationState = notificationState;
    }

    public String getRecipient() {
        return recipient;
    }

    public void setRecipient(String recipient) {
        this.recipient = s(recipient);
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = s(text);
    }

    public Timestamp getCreationDate() {
        return creationDate;
    }

    public void setCreationDate(Timestamp creationDate) {
        this.creationDate = creationDate;
    }

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    //
    //  ------------------------------------------------------------------------------------
    //

    @Override
    public String toString() {
        return "Notification{" +
                "id=" + id +
                ", senderId=" + senderId +
                ", notificationState=" + notificationState +
                ", recipient='" + recipient + '\'' +
                ", text='" + text + '\'' +
                ", creationDate=" + creationDate +
                '}';
    }
}
